home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / sox / misc.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  5KB  |  272 lines

  1. /*
  2.  * July 5, 1991
  3.  * Copyright 1991 Lance Norskog And Sundry Contributors
  4.  * This source code is freely redistributable and may be used for
  5.  * any purpose.  This copyright notice must be maintained. 
  6.  * Lance Norskog And Sundry Contributors are not responsible for 
  7.  * the consequences of using this software.
  8.  */
  9.  
  10. /*
  11.  * Sound Tools miscellaneous stuff.
  12.  */
  13.  
  14. #include "st.h"
  15.  
  16. EXPORT char *sizes[] = {
  17.     "NONSENSE!",
  18.     "bytes",
  19.     "shorts",
  20.     "longs",
  21.     "32-bit floats",
  22.     "64-bit floats",
  23.     "IEEE floats"
  24. };
  25.  
  26. EXPORT char *styles[] = {
  27.     "NONSENSE!",
  28.     "unsigned",
  29.     "signed (2's complement)",
  30.     "u-law",
  31.     "a-law"
  32. };
  33.  
  34. char readerr[] = "Premature EOF while reading sample file.";
  35. char writerr[] = "Error writing sample file.  You are probably out of disk space.";
  36.  
  37. /* Utilities */
  38.  
  39. /* Read short, little-endian: little end first. VAX/386 style. */
  40. unsigned short
  41. rlshort(ft)
  42. ft_t ft;
  43. {
  44.     unsigned char uc, uc2;
  45.     uc  = getc(ft->fp);
  46.     uc2 = getc(ft->fp);
  47.     return (uc2 << 8) | uc;
  48. }
  49.  
  50. /* Read short, bigendian: big first. 68000/SPARC style. */
  51. unsigned short
  52. rbshort(ft)
  53. ft_t ft;
  54. {
  55.     unsigned char uc, uc2;
  56.     uc2 = getc(ft->fp);
  57.     uc  = getc(ft->fp);
  58.     return (uc2 << 8) | uc;
  59. }
  60.  
  61. /* Write short, little-endian: little end first. VAX/386 style. */
  62. unsigned short
  63. #ifdef    __STDC__
  64. wlshort(ft_t ft, unsigned short us)
  65. #else
  66. wlshort(ft, us)
  67. ft_t ft;
  68. unsigned short us;
  69. #endif
  70. {
  71.     putc(us, ft->fp);
  72.     putc(us >> 8, ft->fp);
  73.     if (ferror(ft->fp))
  74.         fail(writerr);
  75. }
  76.  
  77. /* Write short, big-endian: big end first. 68000/SPARC style. */
  78. unsigned short
  79. #ifdef    __STDC__
  80. wbshort(ft_t ft, unsigned short us)
  81. #else
  82. wbshort(ft, us)
  83. ft_t ft;
  84. unsigned short us;
  85. #endif
  86. {
  87.     putc(us >> 8, ft->fp);
  88.     putc(us, ft->fp);
  89.     if (ferror(ft->fp))
  90.         fail(writerr);
  91. }
  92.  
  93. /* Read long, little-endian: little end first. VAX/386 style. */
  94. unsigned long
  95. rllong(ft)
  96. ft_t ft;
  97. {
  98.     unsigned char uc, uc2, uc3, uc4;
  99. /*    if (feof(ft->fp))
  100.         fail(readerr);        /* No worky! */
  101.     uc  = getc(ft->fp);
  102.     uc2 = getc(ft->fp);
  103.     uc3 = getc(ft->fp);
  104.     uc4 = getc(ft->fp);
  105.     return ((long)uc4 << 24) | ((long)uc3 << 16) | ((long)uc2 << 8) | (long)uc;
  106. }
  107.  
  108. /* Read long, bigendian: big first. 68000/SPARC style. */
  109. unsigned long
  110. rblong(ft)
  111. ft_t ft;
  112. {
  113.     unsigned char uc, uc2, uc3, uc4;
  114. /*    if (feof(ft->fp))
  115.         fail(readerr);        /* No worky! */
  116.     uc  = getc(ft->fp);
  117.     uc2 = getc(ft->fp);
  118.     uc3 = getc(ft->fp);
  119.     uc4 = getc(ft->fp);
  120.     return ((long)uc << 24) | ((long)uc2 << 16) | ((long)uc3 << 8) | (long)uc4;
  121. }
  122.  
  123. /* Write long, little-endian: little end first. VAX/386 style. */
  124. unsigned long
  125. wllong(ft, ul)
  126. ft_t ft;
  127. unsigned long ul;
  128. {
  129. int datum;
  130.  
  131.     datum = (ul) & 0xff;
  132.     putc(datum, ft->fp);
  133.     datum = (ul >> 8) & 0xff;
  134.     putc(datum, ft->fp);
  135.     datum = (ul >> 16) & 0xff;
  136.     putc(datum, ft->fp);
  137.     datum = (ul >> 24) & 0xff;
  138.     putc(datum, ft->fp);
  139.     if (ferror(ft->fp))
  140.         fail(writerr);
  141. }
  142.  
  143. /* Write long, big-endian: big end first. 68000/SPARC style. */
  144. unsigned long
  145. wblong(ft, ul)
  146. ft_t ft;
  147. unsigned long ul;
  148. {
  149. int datum;
  150.  
  151.     datum = (ul >> 24) & 0xff;
  152.     putc(datum, ft->fp);
  153.     datum = (ul >> 16) & 0xff;
  154.     putc(datum, ft->fp);
  155.     datum = (ul >> 8) & 0xff;
  156.     putc(datum, ft->fp);
  157.     datum = (ul) & 0xff;
  158.     putc(datum, ft->fp);
  159.     if (ferror(ft->fp))
  160.         fail(writerr);
  161. }
  162.  
  163. /* Read and write words and longs in "machine format".  Swap if indicated. */
  164.  
  165. /* Read short. */
  166. unsigned short
  167. rshort(ft)
  168. ft_t ft;
  169. {
  170.     unsigned short us;
  171.  
  172. /*    if (feof(ft->fp))
  173.         fail(readerr);        /* No worky! */
  174.     fread(&us, 2, 1, ft->fp);
  175.     if (ft->swap)
  176.         us = swapw(us);
  177.     return us;
  178. }
  179.  
  180. /* Write short. */
  181. unsigned short
  182. #ifdef    __STDC__
  183. wshort(ft_t ft, unsigned short us)
  184. #else
  185. wshort(ft, us)
  186. ft_t ft;
  187. unsigned short us;
  188. #endif
  189. {
  190.     if (ft->swap)
  191.         us = swapw(us);
  192.     if (fwrite(&us, 2, 1, ft->fp) != 1)
  193.         fail(writerr);
  194. }
  195.  
  196. /* Read long. */
  197. unsigned long
  198. rlong(ft)
  199. ft_t ft;
  200. {
  201.     unsigned long ul;
  202.  
  203. /*    if (feof(ft->fp))
  204.         fail(readerr);        /* No worky! */
  205.     fread(&ul, 4, 1, ft->fp);
  206.     if (ft->swap)
  207.         ul = swapl(ul);
  208.     return ul;
  209. }
  210.  
  211. /* Write long. */
  212. unsigned long
  213. wlong(ft, ul)
  214. ft_t ft;
  215. unsigned long ul;
  216. {
  217.     if (ft->swap)
  218.         ul = swapl(ul);
  219.     if (fwrite(&ul, 4, 1, ft->fp) != 1)
  220.         fail(writerr);
  221. }
  222.  
  223. /* Byte swappers */
  224.  
  225. unsigned short
  226. #ifdef    __STDC__
  227. swapw(unsigned short us)
  228. #else
  229. swapw(us)
  230. unsigned short us;
  231. #endif
  232. {
  233.     return ((us >> 8) | (us << 8)) & 0xffff;
  234. }
  235.  
  236. unsigned long
  237. swapl(ul)
  238. unsigned long ul;
  239. {
  240.     return (ul >> 24) | ((ul >> 8) & 0xff00) | ((ul << 8) & 0xff0000) | (ul << 24);
  241. }
  242.  
  243. /* dummy routine for do-nothing functions */
  244. int nothing() {;}
  245.  
  246. /* dummy drain routine for effects */
  247. null_drain(effp, obuf, osamp)
  248. eff_t effp;
  249. long *obuf;
  250. long *osamp;
  251. {
  252.     *osamp = 0;
  253. }
  254.  
  255. /* here for linear interp.  might be useful for other things */
  256. gcd(a, b) 
  257. long a, b;
  258. {
  259.     if (b == 0)
  260.         return a;
  261.     else
  262.         return gcd(b, a % b);
  263. }
  264.  
  265. lcm(a, b) 
  266. long a, b;
  267. {
  268.     return (a * b) / gcd(a, b);
  269. }
  270.  
  271. /* sine wave gen should be here, also */
  272.